package gov.pr.celepar.sentinela.admin.action;

import gov.pr.celepar.sentinela.admin.dao.UsuarioDAO;
import gov.pr.celepar.sentinela.admin.dao.factory.DAOFactoryServer;
import gov.pr.celepar.sentinela.admin.facade.UsuarioFacade;
import gov.pr.celepar.sentinela.admin.form.SenhaForm;
import gov.pr.celepar.sentinela.admin.pojo.Usuario;
import gov.pr.celepar.sentinela.client.facade.AutenticacaoBDFacade;
import gov.pr.celepar.sentinela.comunicacao.SentinelaComunicacao;
import gov.pr.celepar.sentinela.comunicacao.SentinelaInterface;
import gov.pr.celepar.sentinela.dao.ParametrosDAO;
import gov.pr.celepar.sentinela.dao.factory.DAOFactory;
import gov.pr.celepar.sentinela.mail.SentinelaMail;
import gov.pr.celepar.sentinela.pojo.Parametros;

import java.util.Collection;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class SenhaAction extends BaseAction {
	private static Log logger = LogFactory.getLog(SenhaAction.class);

	private UsuarioDAO usuarioB = null;

	public String executar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		SenhaForm senhaForm = (SenhaForm) form;

		DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
		SentinelaInterface si = SentinelaComunicacao.getInstance(request);

		this.usuarioB = daoFactory.getUsuarioDAO();

		// Usu�rio Selecionado
		Usuario user = null;
		if (senhaForm.getCodUsuario() != null
				&& !senhaForm.getCodUsuario().equals("")) {
			user = this.usuarioB.consultar(Long.decode(senhaForm
					.getCodUsuario()));
			senhaForm.setNome(user.getNome());

			Collection info = this.usuarioB.getInfoAcessos(user);
			request.setAttribute("info", info);
			logger.debug("grupos: " + info.size());
		} else {
			user = new Usuario();
			senhaForm.setNome("");
		}

		// Processamento da requisi��o
		if (this.CONF_ALTERAR.equalsIgnoreCase(senhaForm.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			try {
				if (senhaForm.getConfirmacaoNovaSenha().equals(senhaForm.getNovaSenha())) {
					alterarSenha(senhaForm, request, si);
					form.reset(mapping, request);
					String msg = this.getResources(request).getMessage("sucesso.senha");
					this.addMessageSucess(msg, request);
				} 
				else{
					form.reset(mapping, request);
					String msg = this.getResources(request).getMessage("erro.senha");
					this.addMessageSucess(msg, request);
				}
			} catch (Exception e) {
				this.addMessageException(e, request);
			}

		} else if ("conf_ativar".equalsIgnoreCase(senhaForm.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			try {
				alterarAtivacao(senhaForm, request, si);
				form.reset(mapping, request);
				String msg = this.getResources(request).getMessage(
						"sucesso.senha.ativa");
				this.addMessageSucess(msg, request);
			} catch (Exception e) {
				this.addMessageException(e, request);
			}
			user = this.usuarioB.consultar(Long.decode(senhaForm
					.getCodUsuario()));
			Collection info = this.usuarioB.getInfoAcessos(user);
			request.setAttribute("info", info);
		} else if ("conf_bloquear".equalsIgnoreCase(senhaForm.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			try {
				alterarBloqueio(senhaForm, request, si);
				form.reset(mapping, request);
				String msg = this.getResources(request).getMessage(
						"sucesso.senha.bloqueio");
				this.addMessageSucess(msg, request);
			} catch (Exception e) {
				this.addMessageException(e, request);
			}
			user = this.usuarioB.consultar(Long.decode(senhaForm
					.getCodUsuario()));
		} else if ("reiniciar_senha".equalsIgnoreCase(senhaForm.getAcao())){
			this.comunicacao.autorizaOperacao('A', request, response);
			try {
				reiniciarSenha(senhaForm, request, si);
				form.reset(mapping, request);
				String msg = this.getResources(request).getMessage(
						"sucesso.senha.reiniciar");
				this.addMessageSucess(msg, request);
			} catch (Exception e) {
				this.addMessageException(e, request);
			}			
		}

		request.setAttribute("usuario", user);

		return "lista_senhas";
	}

	private void alterarSenha(SenhaForm form, HttpServletRequest request,
			SentinelaInterface si) throws Exception {

		Usuario u = UsuarioFacade.consultar(Long.decode(form.getCodUsuario()));

		u.setSenha(form.getNovaSenha());
		u.setDataTrocaSenha(new Date(0));
		UsuarioFacade.alterar(u, request.getRemoteAddr(), si.getCodSistema(),si.getCodUsuario());
	}
	
	private void reiniciarSenha(SenhaForm form, HttpServletRequest request,
			SentinelaInterface si) throws Exception {
		
		String novaSenha = AutenticacaoBDFacade.gerarNovaSenha(); 

		Usuario u = UsuarioFacade.consultar(Long.decode(form.getCodUsuario()));
		u.setSenha(novaSenha);
		u.setDataTrocaSenha(new Date(0));


		UsuarioFacade.alterar(u, request.getRemoteAddr(), si.getCodSistema(),
				si.getCodUsuario());
		
		ParametrosDAO paramDao = DAOFactory.getDAOFactory()
		.getParametrosDAO();
		Parametros parametrosSentinela = paramDao.getParametros();

		//enviar o e-mail para o usu�rio atrav�s da facade
		String emailOrigem = parametrosSentinela.getMailOrigem();
		String emailServer = parametrosSentinela.getMailServer();
		String emailSubject = parametrosSentinela.getMailAssunto();
		String emailMensagem = parametrosSentinela.getMensagemTrocaSenha();
		
		SentinelaMail mail = new SentinelaMail();
		emailMensagem = mail.substituirFrase(1, emailMensagem, novaSenha);
		mail.enviarMailSimples(emailServer, emailSubject, u
				.getEmail(), emailOrigem, emailMensagem);


	}

	private void alterarBloqueio(SenhaForm form, HttpServletRequest request,
			SentinelaInterface si) throws Exception {
		Usuario u = UsuarioFacade.consultar(Long.decode(form.getCodUsuario()));

		u.setBloqueado(!u.getBloqueado());
		u.setTentativasSenhaErrada(0);

		UsuarioFacade.alterar(u, request.getRemoteAddr(), si.getCodSistema(),
				si.getCodUsuario());
	}

	private void alterarAtivacao(SenhaForm form, HttpServletRequest request,
			SentinelaInterface si) throws Exception {
		Usuario u = UsuarioFacade.consultar(Long.decode(form.getCodUsuario()));
		u.setAtivo(!u.getAtivo());

		UsuarioFacade.alterar(u, request.getRemoteAddr(), si.getCodSistema(),
				si.getCodUsuario());
	}

}
